package com.googlecode.controlecheque.filter;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

import android.content.Context;
import android.text.Editable;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.TextWatcher;

public class MoedaTextWatcher implements TextWatcher {

	private static final int ALTERADO_MOEDA_FILTER = 1111;
	private static final String TEXTO_ALTERADO = "TEXTO_ALTERADO";
	private boolean mFormatting;
	private Context contexto;
	private String ultimoValor;

	public MoedaTextWatcher(Context contexto) {
		this.contexto = contexto;
	}

	private Boolean isNumeroInserido(String valorAtual) {
		return ultimoValor != null && ultimoValor.length() < valorAtual.length();
	}

	private Boolean isMesmoValor(String valorAtual) {
		return ultimoValor != null && ultimoValor.equals(valorAtual);

	}

	@Override
	public void afterTextChanged(Editable s) {
		if (!mFormatting && !s.toString().equals("")) {
			mFormatting = true;
			StringBuilder valorDigitado = new StringBuilder(s.toString());
			StringBuilder valorFinal = new StringBuilder("");
			String caracterDigitado = valorDigitado.substring(s.length() - 1);
			SpannableStringBuilder ssBuilder = (SpannableStringBuilder) s;

			boolean isNumero = false;
			try {
				Integer.parseInt(caracterDigitado);
				isNumero = true;
			} catch (Exception ex) {
				isNumero = false;
			}

			if (!isNumero) {
				if (ultimoValor != null) {
					ssBuilder.replace(0, ssBuilder.length(), ultimoValor);
				} else {
					ssBuilder.clear();
				}
			} else {
				if (isMesmoValor(valorDigitado.toString())) {
					mFormatting = false;
					return;
				}
				DecimalFormatSymbols dfSym = new DecimalFormatSymbols();
				String separadorDecimal = String.valueOf(dfSym.getDecimalSeparator());
				if (valorDigitado.length() == 1) {
					valorFinal.append("0");
					valorFinal.append(separadorDecimal);
					valorFinal.append("0");
					valorFinal.append(valorDigitado);
					ssBuilder.replace(0, ssBuilder.length(), valorFinal);
				} else {
					Locale locale = this.contexto.getResources().getConfiguration().locale;
					NumberFormat nf = NumberFormat.getInstance(locale);
					Double proximoValorNumerico = 0d;
					try {
						String valorFinalFormatado = "";
						Double valorNumericoDigitado = nf.parse(valorDigitado.toString()).doubleValue();
						if (isNumeroInserido(valorDigitado.toString())) {
							proximoValorNumerico = (valorNumericoDigitado * 10);
						}
						if (!isNumeroInserido(valorDigitado.toString())) {
							proximoValorNumerico = (valorNumericoDigitado / 10);
						}
						if (ultimoValor == null) {
							proximoValorNumerico = valorNumericoDigitado;
						}
						if (proximoValorNumerico == 0) {
							valorFinalFormatado = "";
						} else {
							DecimalFormat df = new DecimalFormat("###,##0.00");
							valorFinalFormatado = df.format(proximoValorNumerico);
						}
						ssBuilder.replace(0, ssBuilder.length(), valorFinalFormatado);
					} catch (ParseException e) {
						// TODO Auto-generated catch block
					}
				}
				ultimoValor = ssBuilder.toString();
			}

			// SpannableStringBuilder ssBuilder = (SpannableStringBuilder) s;
			// ssBuilder.replace(0, ssBuilder.length(), texto);
			mFormatting = false;
		}
		// SpannableStringBuilder ssBuilder = (SpannableStringBuilder) s;
		// ssBuilder.gets
		// if(ssBuilder.getSpanStart(0)!=-1){
		// ssBuilder.replace(0, ssBuilder.length(), "33");
		// }
		// texto.equals("");
		// ssBuilder.

	}

	@Override
	public void beforeTextChanged(CharSequence s, int start, int count, int after) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onTextChanged(CharSequence s, int start, int before, int count) {
		SpannableStringBuilder ssBuilder = (SpannableStringBuilder) s;
		ssBuilder.setSpan(TEXTO_ALTERADO, 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		// ssBuilder.setSpan(TEXTO_ALTERADO, ALTERADO_MOEDA_FILTER, 0,
		// Spannable.SPAN_COMPOSING);
	}

}
